package financeiro.manager;

import geral.manager.GenericManager;
import geral.manager.UtilManager;
import geral.util.FacesUtil;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import paginacao.ListaPaginada;
import aspecto.annotation.Permissao;
import br.com.sgc.entities.financeiro.ItemCompra;
import br.com.sgc.entities.financeiro.PedidoCompra;
import br.com.sgc.entities.produto.Fornecedor;
import br.com.sgc.entities.produto.ProdutoFinal;
import br.com.sgc.enuns.TipoDesconto;
import br.com.sgc.enuns.TipoOrdenacao;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.permissao.Role;
import br.com.sgc.session.CaixaSession;
import br.com.sgc.session.PedidoCompraSession;
import br.com.sgc.session.ProdutoFinalSession;

@Named
@ConversationScoped
public class PedidoCompraManager extends GenericManager implements Serializable {

	private static final long serialVersionUID = -7901410373037548827L;

	@Inject private UtilManager utilManager;
	
	@EJB private ProdutoFinalSession produtoFinalSession;
	
	@EJB private PedidoCompraSession pedidoCompraSession;
	
	@EJB private CaixaSession caixaSession;
	
	private PedidoCompra pedidoCompra = new PedidoCompra();
	
	private Fornecedor fornecedor = new Fornecedor();
	
	private ProdutoFinal produto = new ProdutoFinal();
	
	private PedidoCompra compra = new PedidoCompra();
	
	private PedidoCompra pedidoCompraSearch = new PedidoCompra();
	
	private ItemCompra item = new ItemCompra();
	
	private List<ProdutoFinal> listProduto = new ArrayList<ProdutoFinal>();
	
	private List<PedidoCompra> listPedido = new ArrayList<PedidoCompra>();
	
	private Boolean showPanelCadastro;
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Compra_Listar)
	public String list(){
		showPanelCadastro = false;
		pedidoCompraSearch = new PedidoCompra();
		listPedido = new ListaPaginada<PedidoCompra>(pedidoCompraSession, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(), pedidoCompraSearch, 5, "id", TipoOrdenacao.DESC);
		return "formPedidoCompra";
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Compra_Salvar)
	public String preparePedidoCompra(){
		utilManager.getClienteManager().prepareSave();
		fornecedor  = new Fornecedor();
		pedidoCompra = new PedidoCompra();
		item = new ItemCompra();
		produto = new ProdutoFinal();
		
		try {
			caixaSession.caixaFechado(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
			showPanelCadastro = true;
		} catch (ValidacaoException e) {
			FacesUtil.mensErro(e.getMessage());
		}
		
		return "formPedidoCompra";
	}
	
	public void selecionarFornecedor(){
		utilManager.getFornecedorManager().prepareUpdate();
		fornecedor = utilManager.getFornecedorManager().getFornecedor();
	}
	
	public void selecionarProduto(){
		item.setPedidoCompra(pedidoCompra);
		produto = produtoFinalSession.findById(ProdutoFinal.class, produto.getId(), true);
		item.setProduto(produto);
		item.setValorUnitario(produto.getValorVenda());
		item.setQuantidade(1.0);
		
	}
	
	public void addItem(){
		item.setValorTotalItem(item.getValorUnitario().multiply(new BigDecimal(item.getQuantidade())));
		if(item.getTipoDesconto() != null){
			if(item.getTipoDesconto().equals(TipoDesconto.MONETARIO)){
				item.setValorTotalItem(item.getValorTotalItem().subtract(item.getValorDesconto()));
			} else if (item.getTipoDesconto().equals(TipoDesconto.PERCENTUAL)){
				item.setValorTotalItem(item.getValorTotalItem().subtract(item.getValorTotalItem().multiply(item.getValorDesconto()).divide(new BigDecimal(100), RoundingMode.HALF_UP)));
			}
			
		}
		pedidoCompra.getProdutos().add(item);
		if(pedidoCompra.getValorTotalCompra() == null){
				pedidoCompra.setValorTotalCompra(new BigDecimal(0.0));
		}
		pedidoCompra.setValorTotalCompra(pedidoCompra.getValorTotalCompra().add(item.getValorTotalItem()));
		item = new ItemCompra();
		produto = new ProdutoFinal();
		
		
	}
	
	public void searchProduto(){
		listProduto = new ListaPaginada<ProdutoFinal>(produtoFinalSession, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(), produto, 10, "codigoProduto", TipoOrdenacao.ASC);
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Compra_Salvar)
	public String guardarPedido(){
		pedidoCompraSession.fillPedidoCompra(pedidoCompra, fornecedor, utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), false, false, true);
		try {
			pedidoCompraSession.guardarPedido(pedidoCompra);
			FacesUtil.mensInfo("Pedido Guardado com sucesso");
			return list();
		} catch (ValidacaoException e) {
			FacesUtil.mensErro(e.getMessage());
			e.printStackTrace();
			return null;
		}
		
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Compra_Salvar)
	public void finalizarPedido(){
		pedidoCompraSession.fillPedidoCompra(pedidoCompra, fornecedor, utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), true, false, false);
		utilManager.getContasPagarManager().prepareSave();
		utilManager.getContasPagarManager().getContasPagar().setValorPrincipal(pedidoCompra.getValorTotalCompra());
	}
	
	@Permissao(role = Role.Sistema_Financeiro_Pedido_Compra_Cancelar)
	public void cancelarPedido(){
		if(pedidoCompra.getId() != null){
			pedidoCompra = pedidoCompraSession.findById(PedidoCompra.class, pedidoCompra.getId());
		}
		
		pedidoCompra = pedidoCompraSession.fillPedidoCompra(pedidoCompra, fornecedor, utilManager.getSegurancaManager().getUsuarioLogado().getClinica(), false, true, false);
		try {
			if(pedidoCompra.getId() != null){
				pedidoCompraSession.cancelarPedido(pedidoCompra);
			}
			list(); 
			FacesUtil.mensInfo("Pedido Cancelado com sucesso");
		} catch (ValidacaoException e) {
			FacesUtil.mensErro(e.getMessage());
			e.printStackTrace();
		}
	}

	public ProdutoFinalSession getProdutoFinalSession() {
		return produtoFinalSession;
	}

	public void setProdutoFinalSession(ProdutoFinalSession produtoFinalSession) {
		this.produtoFinalSession = produtoFinalSession;
	}

	public PedidoCompraSession getPedidoCompraSession() {
		return pedidoCompraSession;
	}

	public void setPedidoCompraSession(PedidoCompraSession pedidoCompraSession) {
		this.pedidoCompraSession = pedidoCompraSession;
	}

	public PedidoCompra getPedidoCompra() {
		return pedidoCompra;
	}

	public void setPedidoCompra(PedidoCompra pedidoCompra) {
		this.pedidoCompra = pedidoCompra;
	}

	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	public ProdutoFinal getProduto() {
		return produto;
	}

	public void setProduto(ProdutoFinal produto) {
		this.produto = produto;
	}

	public PedidoCompra getCompra() {
		return compra;
	}

	public void setCompra(PedidoCompra compra) {
		this.compra = compra;
	}

	public PedidoCompra getPedidoCompraSearch() {
		return pedidoCompraSearch;
	}

	public void setPedidoCompraSearch(PedidoCompra pedidoCompraSearch) {
		this.pedidoCompraSearch = pedidoCompraSearch;
	}

	public ItemCompra getItem() {
		return item;
	}

	public void setItem(ItemCompra item) {
		this.item = item;
	}

	public List<ProdutoFinal> getListProduto() {
		return listProduto;
	}

	public void setListProduto(List<ProdutoFinal> listProduto) {
		this.listProduto = listProduto;
	}

	public List<PedidoCompra> getListPedido() {
		return listPedido;
	}

	public void setListPedido(List<PedidoCompra> listPedido) {
		this.listPedido = listPedido;
	}

	public Boolean getShowPanelCadastro() {
		return showPanelCadastro;
	}

	public void setShowPanelCadastro(Boolean showPanelCadastro) {
		this.showPanelCadastro = showPanelCadastro;
	}

}
